# @Time : 2020/6/28 17:54
# @Author : Fioman 
# @Phone : 13149920693
"""
对象绝对不会执行销毁;然而,无法得到对象时,可能会被当作垃圾回收.
del语句是删除名称,而不是对象.del命令可能会导致对象被当作垃圾回收,但是仅当删除的变量保存的是对象的最后一个引用,或者无法得到对象时.
重新绑定也可能会导致对象的引用数量归零,导致对象被销毁.
有个__del__特殊方法,但是它不会销毁实例,不应该在代码中调用.即将销毁实例时,Python解释器会调用__del__方法,给实例最后的机会,释放外部资源.
在Cpython中,垃圾回收使用的主要算法是引用计数.实际上,每个UI对象都会统计有多少引用指向自己.当引用计数归零后,对象立即被销毁.
CPython会在对象上调用__del__方法(如果定义了),然后释放分配给对象的内存.
为了演示对象声明结束时的情形,使用weakref.finalize注册一个回调函数,在销毁对象时调用.
"""

import weakref

s1 = {1, 2, 3}
s2 = s1 # s1和s2是别名,只想同一个集合,{1,2,3}

# 这个函数一定不能是要销毁的对象的绑定方法,否则会有一个指向对象的引用.
def bye():
    print("Gone with wind...")

# 在s1引用的对象上注册bye回调
ender = weakref.finalize(s1, bye)
# 调用finalize对象之前,.alive属性的值为True
print("ender.alive = {}".format(ender.alive))
# 5. del不删除对象,而是删除对象的引用.
del s1
print("ender.alive = {}".format(ender.alive))
# 6. 重新绑定最后一个引用s2,让{1,2,3}无法获取.对象被销毁了,调用了bye回调,ender.alive变成了False
s2 = "spam"
print("ender.alive = {}".format(ender.alive))

# 这个例子明确指出del不会删除对象,但是执行del操作后可能会导致对象不可获取,从而被删除.














